#!bin/bash
src=$1
module=$2
fromfile=$3
src=${src:-"./"}
fromfile=${fromfile:+" --fromfile ${fromfile} "}

# start command
# chmod +x inotify.sh
# ./inotify.sh > src/log/inotify.log 2>&1 &

# 先进入监控的目录,这样read出来的文件路径就是相对路径
cd ${src}
# 此方法中，由于rsync同步的特性，这里必须要先cd到源目录，inotify再监听 ./ 才能rsync同步后目录结构一致，有兴趣的同学可以进行各种尝试观看其效果
inotifywait -mrq --exclude '.*(\.o)' ${fromfile} --format  '%Xe %w%f' -e create,delete,close_write,move ./ | while read file
# 把监控到有发生更改的"文件路径列表"循环
do
    INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
    INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE
    # echo "-------------------------------$(date)------------------------------------"
    # echo $file
    #增加、修改、写入完成、移动进事件
    #增、改放在同一个判断，因为他们都肯定是针对文件的操作，即使是新建目录，要同步的也只是一个空目录，不会影响速度。
    if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判断事件类型
    then
        # echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
            if [[ -f $INO_FILE ]]
            then
                echo "rsync -avzcR --password-file=%s %s@%s::${module}/${INO_FILE} %s"
            else
                echo "rsync -avzcR --password-file=%s %s@%s::${module}/${INO_FILE} %s"
            fi
    # INO_FILE变量代表路径哦  -c校验文件内容
    #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端
    #环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡)
    #然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
    fi
    #删除、移动出事件
    if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
    then
            # echo 'DELETE or MOVED_FROM'
            if [[ -f $INO_FILE ]]
            then
                echo "rsync -avzcR --delete --password-file=%s %s@%s::${module}/$(dirname ${INO_FILE}) %s"
            else
                echo "rsync -avzcR --delete --password-file=%s %s@%s::${module}/$(dirname ${INO_FILE}) %s"
            fi
    #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径
    #并加上--delete来删除目标上有而源中没有的文件，这里不能做到指定文件删除，如果删除的路径越靠近根，则同步的目录月多，同步删除的操作就越花时间。
    #这里有更好方法的同学，欢迎交流。
    fi
done